// 观察者的目的就是给需要变化的元素增加一个观察者
// 数据变化后执行对应的方法
// 目的：用新值和老值进行比对，如果发生变化，就调用更新方法
class Watcher{
  constructor(vm,expr,cb){
    this.vm = vm;
    this.expr = expr;
    this.cb= cb;
    // 先获取一下老的值
    this.value = this.get(vm,expr);
  }
  // 获取绑定的值 v-model="msg.a"
  getVal(vm,expr){
    expr = expr.split('.');
    return expr.reduce((prev,next)=>{
      return prev[next]
    },vm.$data)
  }
  // 获取没有变更的值
  get(){
    // 将当前的实例Wather赋值给dep
    Dep.target = this;
    // 这里触发了Dep的订阅方法（将这个观察者加入了subs的数组中）
    let value = this.getVal(this.vm,this.expr);
    // 获取到值后对实例进行销毁
    Dep.target = null;
    return value;
  }
  update(){
    let newValue = this.getVal(this.vm,this.expr);
    let oldValue = this.value;
    if(oldValue !== newValue){
      this.cb(newValue);
    }
  }
}